home *** CD-ROM | disk | FTP | other *** search
/ DOpus Plus / DOpus Plus.iso / Tutorial / C Guide / Time_module / IconClock.c < prev    next >
C/C++ Source or Header  |  1998-09-20  |  61KB  |  1,534 lines

  1.  
  2. #include "includes/Clock.h"
  3.  
  4.  
  5. /********************************************************************/
  6.  
  7. struct Gadget gadgets[] =
  8. {    
  9.      {  // the dragbar
  10.         &gadgets[1],  
  11.         12, 0, -24, 8, 
  12.         GFLG_GADGHNONE | GFLG_RELWIDTH,
  13.         GACT_RELVERIFY, GTYP_WDRAGGING,
  14.         NULL, NULL, NULL, NULL,
  15.         NULL, NULL, NULL
  16.      },
  17.      {  // the close gadget
  18.         &gadgets[2],
  19.         0, 0, 12, 8,
  20.         GFLG_GADGHNONE, 
  21.         GACT_RELVERIFY, GTYP_CLOSE,
  22.         NULL, NULL, NULL, NULL,
  23.         NULL, NULL, NULL
  24.      },
  25.      {  // the tofront/toback gadget
  26.         NULL,
  27.         -12, 0, 12, 8,
  28.         GFLG_GADGHNONE | GFLG_RELRIGHT,
  29.         GACT_RELVERIFY, GTYP_WDEPTH,
  30.         NULL, NULL, NULL, NULL,
  31.         NULL, NULL, NULL
  32.      }
  33. };
  34.  
  35. enum
  36. {
  37.     GADGET_ID_TEXT,
  38.     GADGET_ID_HOURS,
  39.     GADGET_ID_MINUTES,
  40.     GADGET_ID_STRING,
  41.     GADGET_ID_OK,
  42.     GADGET_ID_CANCEL
  43. };
  44.  
  45.  
  46. struct TagItem slider[] =
  47. {
  48.     GA_RelVerify, TRUE,
  49.     GTSL_Max, 59,
  50.     TAG_DONE
  51. };
  52.  
  53. ObjectDef winobjects[] =
  54. {
  55.    { 
  56.       OD_GADGET, TEXT_KIND,
  57.       { 0, 0, SIZE_MAXIMUM, 3 },
  58.       { 2, 2, -2, 0 },
  59.       MSG_ALARM, PLACETEXT_IN, 
  60.       GADGET_ID_TEXT, NULL
  61.    },
  62.    
  63.    {
  64.       OD_GADGET, TEXT_KIND,
  65.       { 0, 3, SIZE_MAXIMUM, 1 },
  66.       { 2, 4, -2, 4 },
  67.       NULL, PLACETEXT_IN,
  68.       GADGET_ID_STRING, NULL
  69.    },
  70.    {
  71.       OD_GADGET, SLIDER_KIND,
  72.       { 10, 4, SIZE_MAXIMUM, 1 },
  73.       { 2, 10, -2, 4 },
  74.       MSG_HOURS, PLACETEXT_LEFT,
  75.       GADGET_ID_HOURS, &slider[0]
  76.    },
  77.    {
  78.       OD_GADGET, SLIDER_KIND,
  79.       { 10, 5, SIZE_MAXIMUM, 1 },
  80.       { 2, 14, -2, 4 },
  81.       MSG_MINS, PLACETEXT_LEFT,
  82.       GADGET_ID_MINUTES, &slider[0]
  83.    },
  84.    
  85.    {
  86.       OD_GADGET, BUTTON_KIND,
  87.       { 0, POS_RIGHT_JUSTIFY, 10, 1 },
  88.       { 2, -2, -4, 4 },
  89.       MSG_OK, PLACETEXT_IN | BUTTONFLAG_OKAY_BUTTON,
  90.       GADGET_ID_OK, NULL
  91.    },
  92.    
  93.    {
  94.       OD_GADGET, BUTTON_KIND,
  95.       { POS_RIGHT_JUSTIFY, POS_RIGHT_JUSTIFY, 10, 1 },
  96.       { -2, -2, -4, 4 },
  97.       MSG_CANCEL, PLACETEXT_IN | BUTTONFLAG_CANCEL_BUTTON,
  98.       GADGET_ID_CANCEL, NULL
  99.    },
  100.          
  101.    {  OD_END }
  102. }; 
  103.  
  104. ConfigWindow cfgwin =
  105. {
  106.    { POS_CENTER, POS_CENTER, 30, 8 },
  107.    { 0, 0, 4, 20 }
  108. }; 
  109.  
  110.  
  111. /********************************************************************/
  112. // PROTOS
  113.  
  114. extern BOOL WriteConfig( ClockData *cd );
  115. extern BOOL ReadConfig( ClockData *cd );
  116.  
  117. void                 Deteach( struct Screen *screen);//, IPC_CMDData *idata );
  118. void        __saveds TimerClock( void );
  119. ULONG __asm __saveds clock_startup( register __a0 IPCData   *ipc,
  120.                                     register __a1 ClockData *cd  );
  121.  
  122. BOOL           HandleIDCMP( ClockData *cd ); 
  123. BOOL           DoMenu( ClockData *cd );
  124.  
  125. struct Window *OpenWin(  ClockData *cd );
  126. void           CloseWin( ClockData *cd );
  127.  
  128. void __asm     refresh_callback( register __d0 ULONG type,
  129.                                  register __a0 struct Window *win,
  130.                                  register __a1 ClockData * cd ); 
  131.  
  132. void           BorderDraw( ClockData *cd );
  133. void           PrintTime( ClockData *cd );
  134. void           About( ClockData *cd );
  135. void           GetSizes( ClockData *cd );
  136. void           FRequest( ClockData *cd );
  137. BOOL           PicRequest( ClockData *cd );
  138. void           DisableOther( PopUpMenu *popmenu, ULONG start, ULONG end, ULONG exclude );
  139. BOOL           GetBitMap( ClockData *cd, STRPTR name );
  140. void           BeepBeep( ClockData *cd );
  141. void           GetAlarm( ClockData *cd );
  142. BOOL           HandleOwnRequest( ClockData *cd );
  143. BOOL           HandleIPC( ClockData *cd );
  144. void           InitPopMenu( ClockData *cd );
  145.  
  146. /********************************************************************/
  147.  
  148. void Deteach( struct Screen *screen)//, IPC_CMDData *idata )
  149. {
  150.      ClockData *cd;
  151.           
  152.      if( (cd = AllocMemH( mempool, sizeof(ClockData))) )
  153.        {
  154.           cd->screen  = screen;
  155.           
  156.           cd->a4      =                    getreg( REG_A4 );
  157.           cd->module  = (struct Library *) getreg( REG_A6 );
  158.           cd->library = DOpusBase;
  159.                                        
  160.           ReadConfig( cd );
  161.           
  162.           cd->txtattr.ta_Name = cd->fontname;
  163.                     
  164.           if( !IPC_Launch(0, &clock_ipc, "Timer_Clock",
  165.                           (ULONG) TimerClock, 4000,
  166.                           (ULONG) cd, DOSBase)         )
  167.                FreeMemH( cd );                               
  168.        }   
  169. }
  170.  
  171. /********************************************************************/
  172.  
  173. void __saveds TimerClock( void )
  174. {
  175.      struct Library *DOpusBase; 
  176.      IPCData        *ipc;
  177.      ClockData      *cd;
  178.      
  179.      if (!(DOpusBase=(struct Library *)FindName(&((struct ExecBase *)*((ULONG *)4))->LibList,"dopus5.library")))
  180.          return;
  181.  
  182.      ipc = IPC_ProcStartup( (ULONG *) &cd, clock_startup);
  183.  
  184.      putreg( REG_A4, cd->a4 );
  185.  
  186.      if( !ipc )
  187.        {
  188.           IPC_Free( cd->ipc );
  189.           FreeMemH( cd ); 
  190.           return;
  191.        }
  192.      
  193.      WaitPort( cd->ipc->command_port );
  194.      if( HandleIPC( cd ) )
  195.        {
  196.           IPC_Free( cd->ipc );
  197.           FreeMemH( cd ); 
  198.           return;
  199.        }   
  200.       
  201.      OpenWin( cd );
  202.      
  203.      SetSoftStyle( cd->win->RPort, cd->itext[2].ITextFont->ta_Style, AskSoftStyle( cd->win->RPort));
  204.      
  205.      cd->day = 1;         
  206.      BorderDraw( cd);
  207.      PrintTime( cd );
  208.              
  209.      if( (cd->th = AllocTimer(UNIT_VBLANK, 0)) )
  210.        {
  211.           StartTimer( cd->th, 0, 900000 );
  212.           
  213.           while( TRUE )
  214.             {
  215.                cd->signals = Wait( 1 << cd->th->port->mp_SigBit |
  216.                                    1 << cd->notify_port->mp_SigBit |
  217.                                    1 << cd->ipc->command_port->mp_SigBit |
  218.                                    (cd->win ? 1 << cd->win->UserPort->mp_SigBit : 0) |
  219.                                    (cd->time_req ? 1 << cd->time_req->UserPort->mp_SigBit : 0) |
  220.                                    (cd->req ? 1 << cd->req->UserPort->mp_SigBit : 0) );
  221.                
  222.                if( HandleOwnRequest( cd) )
  223.                  {
  224.                     CloseConfigWindow( cd->time_req );
  225.                     cd->time_req = NULL;
  226.                  }
  227.                
  228.                if( cd->signals & 1 << cd->th->port->mp_SigBit )
  229.                  {
  230.                     GetMsg( cd->th->port );
  231.                     PrintTime( cd );
  232.                     StartTimer( cd->th, 0, 900000 );
  233.                  }
  234.                               
  235.                cd->running = 0;
  236.                  
  237.                if( cd->signals & 1 << cd->ipc->command_port->mp_SigBit )
  238.                  {
  239.                     cd->running = HandleIPC( cd );
  240.                                   
  241.                  }
  242.                            
  243.                if( cd->signals & 1 << cd->notify_port->mp_SigBit )
  244.                  {
  245.                     while( (cd->nmsg = (APTR) GetMsg(cd->notify_port)) )
  246.                       {
  247.                          if( cd->nmsg->dn_Type & DN_OPUS_QUIT )
  248.                               cd->running = TRUE;
  249.                               
  250.                          if( cd->win && (cd->nmsg->dn_Type & DN_OPUS_HIDE) )
  251.                            {
  252.                               cd->ibox.Left = cd->win->LeftEdge;
  253.                               cd->ibox.Top = cd->win->TopEdge;
  254.                               cd->ibox.Width = cd->win->Width;
  255.                               cd->ibox.Height = cd->win->Height;
  256.                               
  257.                               CloseWin( cd );
  258.                               cd->win = NULL;
  259.                               
  260.                               cd->day = 1;
  261.                                                                            
  262.                            }
  263.                          
  264.                          if( !cd->win && (cd->nmsg->dn_Type & DN_OPUS_SHOW) )
  265.                            {
  266.                               cd->screen = ((struct Window *) cd->nmsg->dn_Data)->WScreen;
  267.                               
  268.                               // FRAGLICH !! (wegen der Geschwindigkeit...)
  269.                                                             
  270.                               OpenWin( cd );
  271.                            }                        
  272.                          ReplyFreeMsg( (APTR) cd->nmsg );
  273.                       }                  
  274.                  }
  275.           
  276.                if( cd->running || (cd->win && HandleIDCMP(cd)) )
  277.                     break;
  278.                                           
  279.                if( cd->req && SysReqHandler(cd->req, NULL, FALSE) > -2 )
  280.                  {
  281.                     FreeSysRequest( cd->req );
  282.                     cd->req = NULL;
  283.                  }       
  284.              }        
  285.        }
  286.      CloseWin( cd ); 
  287.      
  288.      if( cd->time_req )
  289.           CloseConfigWindow( cd->time_req );
  290.         
  291.      if( cd->bm )
  292.           FreeBitMap( cd->bm );
  293.         
  294.      FreeTimer( cd->th );
  295.      
  296.      if( cd->sound )
  297.           DisposeDTObject( cd->sound );
  298.      
  299.      if( cd->alarm )
  300.           DisposeDTObject( cd->alarm );
  301.      
  302.      while( !IsListEmpty((struct List *) &cd->popmenu.item_list) )
  303.              FreeMemH( RemTail((struct List *) &cd->popmenu.item_list) );
  304.              
  305.      while( !IsListEmpty((struct List *) &cd->submenu) )
  306.              FreeMemH( RemTail((struct List *) &cd->submenu) );
  307.      
  308.      while( !IsListEmpty((struct List *) &cd->subtime) )
  309.              FreeMemH( RemTail((struct List *) &cd->subtime) );         
  310.  
  311.      CloseFont( cd->txtfont );
  312.          
  313.      if( cd->notify_port )
  314.        {
  315.           if( cd->notify )
  316.                RemoveNotifyRequest( cd->notify );
  317.                
  318.           while( (cd->nmsg = (APTR) GetMsg(cd->notify_port)) )
  319.                ReplyFreeMsg( (APTR) cd->nmsg );
  320.                
  321.           DeleteMsgPort( cd->notify_port );
  322.        }
  323.           
  324.      --cd->module->lib_OpenCnt;
  325.      IPC_Free( cd->ipc );
  326.      FreeMemH( cd );
  327.      clock_ipc = NULL;
  328. }
  329.  
  330. /********************************************************************/
  331.  
  332. ULONG __asm __saveds clock_startup( register __a0 IPCData   *ipc,
  333.                                     register __a1 ClockData *cd )
  334. {
  335.         struct Library *DOpusBase;
  336.         
  337.         putreg( REG_A4,cd->a4 );
  338.         cd->ipc = ipc;
  339.         DOpusBase = cd->library;
  340.         
  341.         if( !cd->screen )
  342.              UnlockPubScreen( NULL, (cd->screen = LockPubScreen(NULL)) );
  343.                       
  344.         if( !cd->txtattr.ta_YSize )
  345.              cd->txtattr.ta_YSize = cd->screen->Font->ta_YSize;
  346.          
  347.         if( cd->fontname )
  348.           {
  349.              if( Strnicmp(&cd->fontname[cd->running=strlen(cd->fontname)-5], ".font", 5) )
  350.                   strcat( cd->fontname, ".font" );
  351.           }
  352.         else
  353.              strcpy( cd->txtattr.ta_Name, cd->screen->Font->ta_Name );
  354.         
  355.         cd->txtfont = OpenDiskFont( &cd->txtattr );
  356.                           
  357.         if( !cd->itext[0].FrontPen )
  358.              cd->itext[0].FrontPen = 1;
  359.                                 
  360.         for( cd->running = 0; cd->running < 3; cd->running++ )
  361.           {
  362.              cd->itext[cd->running].IText     = &cd->ibuffer[cd->running][0];
  363.              cd->itext[cd->running].FrontPen  = cd->itext[0].FrontPen;
  364.              cd->itext[cd->running].BackPen   = cd->itext[0].BackPen;
  365.              cd->itext[cd->running].DrawMode  = cd->itext[0].DrawMode;
  366.              cd->itext[cd->running].ITextFont = &cd->txtattr;
  367.                          
  368.              if( cd->running < 2 )
  369.                   cd->itext[cd->running].NextText  = &cd->itext[cd->running+1];
  370.           }
  371.                           
  372.         GetSizes( cd );
  373.         
  374.         if( !cd->ibox.Left )
  375.           {
  376.              if( !(cd->flags & LEFT_PASSED) )
  377.                   cd->ibox.Left = DEFAULT_LEFT_EDGE;
  378.           }
  379.         
  380.         if( (cd->ibox.Left + cd->ibox.Width) > (cd->screen->LeftEdge + cd->screen->Width) )
  381.              cd->ibox.Left = cd->screen->LeftEdge + cd->screen->Width - cd->ibox.Width;
  382.               
  383.         if( !cd->ibox.Top )
  384.           {
  385.              if( !(cd->flags & TOP_PASSED) )
  386.                   cd->ibox.Top  = DEFAULT_TOP_EDGE;
  387.           }
  388.           
  389.         if( (cd->ibox.Top + cd->ibox.Height) > (cd->screen->TopEdge + cd->screen->Height) )
  390.              cd->ibox.Top = cd->screen->TopEdge + cd->screen->Height - cd->ibox.Height;
  391.          
  392.         cd->flags >>= 9;
  393.         cd->flags <<= 9;
  394.         
  395.         if( (cd->flags & BG_TRANS) ||
  396.             (cd->flags & BG_PIC) )
  397.           {
  398.               cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
  399.                                     cd->screen->RastPort.BitMap->Depth,
  400.                                     BMF_MINPLANES, cd->screen->RastPort.BitMap );
  401.                                     
  402.               if( cd->flags & BG_PIC )
  403.                 {                                   
  404.                    if( GetBitMap(cd, cd->picture) )
  405.                      {
  406.                         cd->flags >>= 11;
  407.                         cd->flags <<= 11;
  408.                      }
  409.                    else
  410.                         cd->flags ^= BG_PIC;
  411.                 }
  412.                 
  413.               if( cd->flags & BG_TRANS )
  414.                 {
  415.                    cd->flags >>= 10;
  416.                    cd->flags <<= 10;
  417.                    
  418.                 } 
  419.           }
  420.         
  421.         if( !(cd->flags & BG_PIC) &&
  422.             !(cd->flags & BG_TRANS) )
  423.              cd->flags |= BG_PLAIN;
  424.         
  425.         if( cd->flags & BORDER_OFF )
  426.           {
  427.              if( cd->flags & BORDER )
  428.                   cd->flags ^= BORDER;
  429.              cd->flags ^= BORDER_OFF;
  430.           }
  431.         else
  432.           {
  433.              if( cd->flags & BORDER_ON )
  434.                {
  435.                   cd->flags |= BORDER;
  436.                   cd->flags ^= BORDER_ON;
  437.                }
  438.           }
  439.          
  440.         cd->day = 1;
  441.                
  442.         if( (cd->notify_port = CreateMsgPort()) )
  443.           {
  444.              cd->notify = AddNotifyRequest( DN_OPUS_QUIT | DN_OPUS_HIDE | DN_OPUS_SHOW,
  445.                                             NULL, cd->notify_port );
  446.           }
  447.         
  448.         InitPopMenu( cd );  
  449.              
  450.         ++cd->module->lib_OpenCnt;        
  451.         return 1;
  452. }  
  453.  
  454. /********************************************************************/
  455.  
  456. BOOL HandleIDCMP( ClockData *cd ) 
  457. {  
  458.      while( (cd->inmsg = GT_GetIMsg(cd->win->UserPort)) )
  459.        {
  460.           cd->imsg = *cd->inmsg;
  461.           GT_ReplyIMsg( cd->inmsg ); 
  462.                       
  463.           switch( cd->imsg.Class )
  464.             {
  465.                case IDCMP_REFRESHWINDOW:
  466.                     
  467.                     refresh_callback( 0, cd->win, cd );                    
  468.                     break;
  469.                     
  470.                case IDCMP_CHANGEWINDOW:
  471.                                                       
  472.                     cd->ibox.Left = cd->win->LeftEdge;
  473.                     cd->ibox.Top = cd->win->TopEdge;
  474.                     cd->ibox.Width = cd->win->Width;
  475.                     cd->ibox.Height = cd->win->Height;
  476.                                       
  477.                     CloseWin( cd );
  478.                                                              
  479.                     OpenWin( cd );
  480.                     
  481.                     break;
  482.                
  483.                case IDCMP_ACTIVEWINDOW:               
  484.                case IDCMP_INACTIVEWINDOW:
  485.                     
  486.                     cd->day = 1;
  487.                     
  488.                     BorderDraw( cd );
  489.                     PrintTime( cd );
  490.                     break;
  491.                 
  492.                case IDCMP_CLOSEWINDOW:
  493.                     
  494.                     if( cd->req )
  495.                          break; 
  496.                          
  497.                     return TRUE;                    
  498.                     
  499.                case IDCMP_MOUSEBUTTONS:
  500.                                                  
  501.                     if( !cd->req && cd->imsg.Code == SELECTDOWN &&
  502.                          DoMenu(cd) )  
  503.                          return TRUE;
  504.                     break;                  
  505.             }                
  506.        }      
  507.      return FALSE;    
  508. }
  509.  
  510.  
  511. BOOL DoMenu( ClockData *cd )
  512. {
  513.    
  514.      if( DoPopUpMenu(cd->win, &cd->popmenu, &cd->popitem, SELECTDOWN) != -1 )
  515.        {
  516.           switch( cd->popitem->id )
  517.             {
  518.                case POPID_SOUND:       cd->flags ^= SOUND;
  519.                                        //if( cd->flags
  520.                                        break;
  521.                                        
  522.                case POPID_FIX_IT:      WriteConfig( cd );
  523.                                        break;
  524.                                        
  525.                case POPID_BORDER:
  526.                                        if( cd->popitem->flags & POPUPF_CHECKED )
  527.                                             cd->flags |= BORDER;
  528.                                        else
  529.                                             cd->flags ^= (cd->flags & BORDER) ? BORDER : 0;
  530.                                                            
  531.                                        BorderDraw( cd );
  532.                                        break;
  533.                                                                                                                     
  534.                case POPID_AUTOSTART:                                                         
  535.                                        SetEnv( CLOCKSTARTVAR, (cd->popitem->flags & POPUPF_CHECKED) ? "1" : "0", TRUE );
  536.                                        break;
  537.                                                            
  538.                case POPID_CHANGE_FONT:
  539.                                        cd->ibox.Left = cd->win->LeftEdge;
  540.                                        cd->ibox.Top = cd->win->TopEdge;
  541.                                                                                                                     
  542.                                        CloseWin( cd );
  543.                                                            
  544.                                        if( cd->bm )
  545.                                          {
  546.                                             FreeBitMap( cd->bm );
  547.                                             cd->bm = NULL;
  548.                                          }                                       
  549.                                                                 
  550.                                        FRequest( cd );
  551.                                        GetSizes( cd );
  552.                                                            
  553.                                        if( cd->flags & BG_PIC ||
  554.                                            cd->flags & BG_TRANS )
  555.                                          {
  556.                                             cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
  557.                                                                   cd->screen->RastPort.BitMap->Depth,
  558.                                                                   BMF_MINPLANES, cd->screen->RastPort.BitMap );
  559.                                                                 
  560.                                             if( cd->flags & BG_PIC )
  561.                                                  GetBitMap( cd, cd->picture );                                                              
  562.                                          }
  563.                                        
  564.                                        OpenWin( cd );
  565.                                        break;
  566.                                                            
  567.                case POPID_CLOSE:
  568.                                        return TRUE;
  569.                                                            
  570.                case POPID_ALARMSET:    GetAlarm( cd );
  571.                                        break;                          
  572.                                                            
  573.                case POPID_ALARMONOFF:
  574.                                        if( cd->popitem->flags & POPUPF_CHECKED )
  575.                                             cd->flags |= ALARM;
  576.                                        else
  577.                                             cd->flags ^= ALARM;
  578.                                        break;
  579.                                                            
  580.                case POPID_ABOUT:
  581.                                        if( !cd->req )
  582.                                             About( cd );
  583.                                        break;
  584.                                                            
  585.                case POPID_PLAIN:       
  586.                                        cd->flags = (cd->flags & BORDER) ? BORDER|BG_PLAIN : BG_PLAIN;
  587.                                        
  588.                                        if( cd->bm )
  589.                                          {
  590.                                             FreeBitMap( cd->bm );
  591.                                             cd->bm = NULL;
  592.                                          }
  593.                                                            
  594.                                        BorderDraw( cd );
  595.                                        DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, cd->popitem->id );
  596.                                        break;
  597.                                    
  598.                case POPID_TRANSPARENT:
  599.                                        cd->flags = (cd->flags & BORDER) ? BORDER|BG_TRANS : BG_TRANS;
  600.                                        CloseWin( cd );
  601.                                                                                                              
  602.                                        if( !cd->bm )
  603.                                          {
  604.                                             cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
  605.                                                                   cd->screen->RastPort.BitMap->Depth,
  606.                                                                   BMF_MINPLANES, cd->screen->RastPort.BitMap );
  607.                                          }
  608.                                                                                                                        
  609.                                        OpenWin( cd );
  610.                                        DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, cd->popitem->id );
  611.                                        break;
  612.                                    
  613.                case POPID_PICTURE:                                                              
  614.                                        CloseWin( cd );
  615.                                                                                                              
  616.                                        if( (PicRequest(cd) && cd->picture[0]) )
  617.                                          {
  618.                                             if( !cd->bm )
  619.                                               {
  620.                                                  cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
  621.                                                                        cd->screen->RastPort.BitMap->Depth,
  622.                                                                        BMF_MINPLANES, cd->screen->RastPort.BitMap );
  623.                                               }
  624.                                             
  625.                                             if( GetBitMap(cd, cd->picture) )
  626.                                               {
  627.                                                  cd->flags = (cd->flags & BORDER) ? BORDER|BG_PIC : BG_PIC;
  628.                                                  DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, cd->popitem->id );
  629.                                               }
  630.                                             else
  631.                                                  cd->popitem->flags ^= POPUPF_CHECKED;
  632.                                          }
  633.                                        else
  634.                                          {
  635.                                             if( cd->flags & BG_PIC )
  636.                                                  GetPopUpItem( &cd->popmenu, POPID_PICTURE )->flags |= POPUPF_CHECKED;
  637.                                             else
  638.                                                  cd->popitem->flags ^= POPUPF_CHECKED;
  639.                                          }
  640.                                        OpenWin( cd );
  641.                                        break;                                      
  642.             }
  643.        }  
  644.      return FALSE;
  645. }
  646.  
  647. /********************************************************************/
  648. // WINDOW STUFF 
  649.  
  650. struct Window *OpenWin( ClockData *cd )
  651. {   
  652.      if( (cd->pubscr = FindPubScreen(cd->screen, TRUE)) )
  653.        {        
  654.           if( cd->bm && (cd->flags & BG_TRANS) )
  655.                BltBitMap( cd->screen->RastPort.BitMap,
  656.                           cd->ibox.Left, cd->ibox.Top,
  657.                           cd->bm,
  658.                           0, 0,
  659.                           cd->ibox.Width, cd->ibox.Height,
  660.                           ABNC|ABC,
  661.                           -1, NULL );  
  662.              
  663.           cd->win = OpenWindowTags( NULL,
  664.                                     WA_Left,    cd->ibox.Left,
  665.                                     WA_Top,     cd->ibox.Top,
  666.                                     WA_Height,  cd->ibox.Height,
  667.                                     WA_Width,   cd->ibox.Width,
  668.                                     
  669.                                     WA_Gadgets, &gadgets[0],
  670.                                     
  671.                                     WA_Flags,   WFLG_BORDERLESS    | WFLG_NEWLOOKMENUS    |
  672.                                                 WFLG_SIMPLE_REFRESH,
  673.                                                 
  674.                                     WA_IDCMP,   IDCMP_CHANGEWINDOW | IDCMP_REFRESHWINDOW  |
  675.                                                 IDCMP_ACTIVEWINDOW | IDCMP_INACTIVEWINDOW |
  676.                                                 IDCMP_CLOSEWINDOW  | IDCMP_MOUSEBUTTONS,
  677.                                                 
  678.                                     WA_AutoAdjust, TRUE,                                  
  679.                                     WA_ScreenTitle, VERSION_STRING,
  680.                                     WA_PubScreen, cd->pubscr->psn_Screen,
  681.                                     
  682.                                     TAG_DONE );
  683.                      
  684.           BorderDraw( cd );
  685.             
  686.           cd->day = 1;
  687.           PrintTime( cd );
  688.              
  689.           UnlockPubScreen( NULL, cd->pubscr->psn_Screen );          
  690.        }      
  691.      return cd->win;
  692. }
  693.  
  694. void CloseWin( ClockData *cd )
  695. {
  696.      if( cd->req )
  697.        {
  698.           FreeSysRequest( cd->req );
  699.           cd->req = NULL;
  700.        }
  701.             
  702.      CloseWindow( cd->win );    
  703. }
  704.  
  705.  
  706. // USED FOR REFRESH ON IDCMP-MESSAGES *AND* FOR THE POPUP-MENU
  707.  
  708. void __asm refresh_callback( register __d0 ULONG type,
  709.                              register __a0 struct Window *win,
  710.                              register __a1 ClockData *cd ) 
  711. {
  712.      GT_BeginRefresh( win );
  713.         
  714.      cd->day = 1;
  715.      BorderDraw( cd );
  716.      PrintTime( cd );
  717.               
  718.      GT_EndRefresh( win, TRUE );
  719. }
  720.  
  721. /********************************************************************/
  722.  
  723. void BorderDraw( ClockData *cd )
  724. {                        
  725.       if( cd->bm )
  726.            BltBitMapRastPort( cd->bm,
  727.                               0, 0, 
  728.                               cd->win->RPort,
  729.                               0, 0,
  730.                               cd->win->Width, cd->win->Height,
  731.                               ABNC|ABC );
  732.       else
  733.            EraseRect( cd->win->RPort, 
  734.                       0, 0,
  735.                       cd->win->Width, cd->win->Height );
  736.                      
  737.       if( !(cd->flags & BORDER) )
  738.            return;
  739.               
  740.      SetAPen( cd->win->RPort, 1 );
  741.      Move( cd->win->RPort, 1, cd->win->Height - 1 );
  742.      Draw( cd->win->RPort, cd->win->Width-1, cd->win->Height - 1 );
  743.      Draw( cd->win->RPort, cd->win->Width-1, 1 );
  744.      SetAPen( cd->win->RPort, 2 );
  745.      Move( cd->win->RPort, 0, cd->win->Height - 1 );
  746.      Draw( cd->win->RPort, 0, 0 );
  747.      Draw( cd->win->RPort, cd->win->Width-1, 0 );         
  748. }
  749.  
  750. void PrintTime( ClockData *cd )
  751. {        
  752.      DateStamp( &cd->date );
  753.      
  754.      cd->hour = UDivMod32( cd->date.ds_Minute, 60 );
  755.                                                  
  756.      cd->minute = getreg(REG_D1);
  757.      
  758.      if( cd->day && cd->day != cd->date.ds_Days )
  759.        {
  760.           cd->dt.dat_Stamp   = cd->date;
  761.           cd->dt.dat_Format  = FORMAT_DOS;
  762.           cd->dt.dat_Flags   = 0;
  763.           cd->dt.dat_StrDay  = cd->itext[1].IText;
  764.           cd->dt.dat_StrDate = cd->itext[0].IText;
  765.           cd->dt.dat_StrTime = 0;
  766.                          
  767.           DateToStr( &cd->dt );
  768.        }
  769.        
  770.      if( cd->bm )
  771.           BltBitMapRastPort( cd->bm, 
  772.                              cd->itext[2].LeftEdge, cd->itext[2].TopEdge+10,
  773.                              cd->win->RPort,
  774.                              cd->itext[2].LeftEdge, cd->itext[2].TopEdge+10,
  775.                              IntuiTextLength(&cd->itext[2]), (cd->itext[2].ITextFont ? cd->itext[2].ITextFont->ta_YSize : cd->screen->Font->ta_YSize),
  776.                              ABNC|ABC );
  777.      else
  778.        {
  779.                                           
  780.           EraseRect( cd->win->RPort, 
  781.                      2, 8,
  782.                      cd->win->Width - 4, 
  783.                      ( (cd->day != cd->date.ds_Days) ? cd->win->Height - 2 : 9 + (cd->itext[2].ITextFont ? cd->itext[2].ITextFont->ta_YSize : cd->screen->Font->ta_YSize)) );            
  784.            
  785.        }
  786.                
  787.      sprintf( cd->itext[2].IText, "%02ld%lc%02ld", cd->hour, UDivMod32(cd->date.ds_Tick, TICKS_PER_SECOND)%2 ? ':' : '.', cd->minute ); 
  788.         
  789.      for( cd->running = 0; cd->running < 3; cd->running++ )
  790.        {
  791.           cd->itext[cd->running].LeftEdge = (cd->win->Width - IntuiTextLength(&cd->itext[cd->running]))/2;
  792.           cd->itext[2-cd->running].TopEdge  = (cd->win->Height-10)/3*cd->running;
  793.        }     
  794.         
  795.      cd->running = 2;      
  796.                   
  797.      if( cd->day != cd->date.ds_Days )
  798.        {
  799.           cd->running = 0; 
  800.           
  801.           if( cd->bm )
  802.                BltBitMapRastPort( cd->bm, 
  803.                                   2, 8,
  804.                                   cd->win->RPort,
  805.                                   2, 8,
  806.                                   cd->win->Width-4, cd->win->Height-12,
  807.                                   ABNC|ABC );
  808.                      
  809.           cd->day = cd->date.ds_Days;
  810.        }
  811.            
  812.      PrintIText( cd->win->RPort, &cd->itext[cd->running], 0, 10 );
  813.      
  814.      BeepBeep( cd );
  815. }  
  816.  
  817. /********************************************************************/
  818.  
  819. void About( ClockData *cd )
  820. {
  821.      cd->es.es_StructSize   = sizeof( struct EasyStruct );
  822.      cd->es.es_Title        = DOpusGetString( locale, MSG_TITLE );
  823.      cd->es.es_TextFormat   = DOpusGetString( locale, MSG_CLOCKABOUT );
  824.      cd->es.es_GadgetFormat = DOpusGetString( locale, MSG_CLOCKOK );
  825.      
  826.      cd->req = BuildEasyRequestArgs( cd->win, &cd->es, IDCMP_GADGETUP, NULL );
  827. }
  828.  
  829.  
  830. void GetSizes( ClockData *cd )
  831.         strcpy( cd->itext[2].IText, "  88-FEB-88  " );
  832.        
  833.         cd->ibox.Width  = IntuiTextLength( &cd->itext[2] ) + 4;
  834.               
  835.         cd->ibox.Height = (cd->itext[2].ITextFont ? cd->itext[2].ITextFont->ta_YSize : cd->screen->Font->ta_YSize) * 3 + 18;
  836.               
  837. }
  838.  
  839. /********************************************************************/
  840.  
  841. void FRequest( ClockData *cd )
  842. {
  843.      if( (cd->freq = AllocAslRequest(ASL_FontRequest, NULL)) )
  844.        {
  845.           if( AslRequestTags( cd->freq,
  846.                               ASLFO_Screen,       cd->screen,
  847.                               
  848.                               ASLFO_DoFrontPen,   TRUE,
  849.                               ASLFO_DoBackPen,    TRUE,
  850.                               ASLFO_DoDrawMode,   TRUE,
  851.                               ASLFO_DoStyle,      TRUE,
  852.                               
  853.                               ASLFO_TitleText, DOpusGetString(locale,  MSG_CHOOSEFONT),
  854.                               
  855.                               TAGIF(cd->fontname[0],  ASLFO_InitialName),  cd->fontname,
  856.                               TAGIF(cd->fontname[0],  ASLFO_InitialSize),  cd->txtattr.ta_YSize,
  857.                               TAGIF(cd->fontname[0],  ASLFO_InitialStyle), cd->txtattr.ta_Style,
  858.                               TAGIF(cd->fontname[0],  ASLFO_InitialFlags), cd->txtattr.ta_Flags,
  859.                               ASLFO_InitialFrontPen, (cd->fontname[0] ? cd->itext[0].FrontPen : 1),
  860.                          
  861.                               TAGIF(cd->fontname[0],  ASLFO_InitialBackPen),   cd->itext[0].BackPen,
  862.                               TAGIF(cd->fontname[0],  ASLFO_InitialDrawMode),  cd->itext[0].DrawMode,
  863.                               TAG_DONE ) )
  864.             {
  865.                cd->txtattr = cd->freq->fo_Attr;
  866.                      
  867.                     if( cd->txtfont )
  868.                       {
  869.                          CloseFont( cd->txtfont );
  870.                          
  871.                       }
  872.                          
  873.                     strcpy( cd->fontname, cd->freq->fo_Attr.ta_Name );
  874.                     cd->txtattr.ta_Name = cd->fontname;
  875.                     cd->txtfont = OpenDiskFont( &cd->txtattr );
  876.                    
  877.                for( cd->running = 0; cd->running < 3; cd->running++ )
  878.                  {
  879.                     cd->itext[cd->running].ITextFont = &cd->txtattr;
  880.                     cd->itext[cd->running].FrontPen  = cd->freq->fo_FrontPen;
  881.                     cd->itext[cd->running].BackPen   = cd->freq->fo_BackPen;
  882.                     cd->itext[cd->running].DrawMode  = cd->freq->fo_DrawMode;
  883.                     
  884.                  }               
  885.             }
  886.          FreeAslRequest( cd->freq );
  887.        }
  888. }
  889.  
  890.  
  891. BOOL PicRequest( ClockData *cd )
  892. {
  893.      STRPTR ptr;
  894.      
  895.      if( (cd->freq = AllocAslRequest(ASL_FileRequest, NULL)) )
  896.        {
  897.           cd->buffer[0] = 0;
  898.           
  899.           if( cd->picture[0] )
  900.             {
  901.                strcpy( cd->buffer, (ptr = FilePart(cd->picture)) );
  902.                *ptr = 0;
  903.             }
  904.           
  905.           cd->running = FALSE;
  906.           
  907.           while( !(cd->running = AslRequestTags( (struct FileRequester *) cd->freq,
  908.                                                  ASLFR_Screen,       cd->screen,                                                                                     
  909.                                                  ASLFR_TitleText, DOpusGetString(locale,  MSG_CHOOSEPIC),
  910.                                                  TAGIF(cd->buffer[0], ASLFR_InitialFile), cd->buffer,
  911.                                                  TAGIF(cd->picture[0], ASLFR_InitialDrawer), cd->picture,
  912.                                                  TAG_DONE )) && IoErr() );
  913.           if( cd->running )
  914.             {
  915.                AddPart( cd->picture, ((struct FileRequester *) cd->freq)->fr_Drawer, 256 );
  916.                AddPart( cd->picture, ((struct FileRequester *) cd->freq)->fr_File, 256 );
  917.             }  
  918.           else
  919.             {
  920.                if( cd->buffer[0] )
  921.                     AddPart( cd->picture, cd->buffer, 256 );
  922.             }
  923.           
  924.           FreeAslRequest( cd->freq );            
  925.        }
  926.        
  927.      return (BOOL) cd->running;
  928. }
  929.  
  930. void DisableOther( PopUpMenu *popmenu, ULONG start, ULONG end, ULONG exclude )
  931. {
  932.      ULONG counter;
  933.      PopUpItem *item;
  934.      
  935.      GetPopUpItem( popmenu, exclude )->flags |= POPUPF_CHECKED;
  936.       
  937.      for( counter = start; counter <= end; counter++ )
  938.        {
  939.           if( counter != exclude &&
  940.               ( item = GetPopUpItem(popmenu, counter) )->flags & POPUPF_CHECKED )
  941.               item->flags ^= POPUPF_CHECKED;
  942.        } 
  943. }
  944.  
  945. /********************************************************************/
  946.  
  947. BOOL GetBitMap( ClockData *cd, STRPTR name )
  948. {
  949.      cd->running = FALSE;  
  950.      
  951.      if( cd->bm )
  952.        {
  953.           if( strlen(name) )
  954.             {                                            
  955.                if( (cd->obj = NewDTObject(name,
  956.                                           DTA_SourceType,        DTST_FILE,
  957.                                           PDTA_Screen,           cd->screen,
  958.                                           OBP_Precision,         PRECISION_EXACT,
  959.                                           DTA_GroupID,           GID_PICTURE,
  960.                                           PDTA_FreeSourceBitMap, TRUE,
  961.                                           TAG_DONE)) )
  962.                  {                                                        
  963.                     if( DoMethod( cd->obj, DTM_PROCLAYOUT, NULL, 1 ) )
  964.                       {                                                                          
  965.                          GetDTAttrs( cd->obj,
  966.                                      PDTA_DestBitMap,   &cd->sourcebm,
  967.                                      PDTA_BitMapHeader, &cd->sourcebmhead,
  968.                                      TAG_DONE );
  969.                                               
  970.                          cd->bsa.bsa_XSrcFactor  = cd->bsa.bsa_SrcWidth = cd->sourcebmhead->bmh_Width;
  971.                          cd->bsa.bsa_YSrcFactor  = cd->bsa.bsa_SrcHeight = cd->sourcebmhead->bmh_Height;
  972.                                                       
  973.                          cd->bsa.bsa_XDestFactor = cd->ibox.Width;
  974.                          cd->bsa.bsa_YDestFactor = cd->ibox.Height;
  975.                          cd->bsa.bsa_SrcBitMap   = cd->sourcebm;
  976.                          cd->bsa.bsa_DestBitMap  = cd->bm;
  977.                            
  978.                          BitMapScale( &cd->bsa );
  979.                          cd->running = TRUE;
  980.                       }
  981.                     
  982.                     DisposeDTObject( cd->obj );
  983.                     cd->obj = NULL;
  984.                  }               
  985.             }         
  986.        }
  987.      
  988.      return (BOOL) cd->running;  
  989. }
  990.  
  991. void BeepBeep( ClockData *cd )
  992. {
  993.      
  994.           
  995.      if( cd->hour > 12 )
  996.          cd->hour -= 12;
  997.      
  998.      switch( cd->minute )
  999.        {
  1000.           case  0: if( (cd->flags & SOUND) && !(cd->flags & WRING_DONE) &&
  1001.                         (cd->sound = NewDTObject( "DOpus5:Sounds/Hour.snd",
  1002.                                                   DTA_GroupID, GID_SOUND,
  1003.                                                   TAG_DONE)) )
  1004.                      {
  1005.                         SetAttrs( cd->sound, SDTA_Cycles, !cd->hour ? 12 : cd->hour, TAG_DONE );
  1006.                         DoMethod( cd->sound, DTM_TRIGGER, NULL, STM_PLAY, TAG_DONE );
  1007.                         cd->flags |= WRING_DONE;
  1008.                      }
  1009.                    break;          
  1010.           
  1011.           case  1: if( cd->flags & WRING_DONE )
  1012.                      {
  1013.                         DisposeDTObject( cd->sound );
  1014.                         cd->flags ^= WRING_DONE;
  1015.                         cd->sound = NULL;                  
  1016.                      }
  1017.                    break;
  1018.           
  1019.           case 15:
  1020.           case 30:          
  1021.           case 45: if( (cd->flags & SOUND) && !(cd->flags & WRING_DONE) &&
  1022.                         (cd->sound = NewDTObject( "DOpus5:Sounds/Quarter.snd",
  1023.                                                    DTA_GroupID, GID_SOUND,
  1024.                                                    TAG_DONE)) )
  1025.                      {
  1026.                         SetAttrs( cd->sound, SDTA_Cycles, cd->minute/15, TAG_DONE );
  1027.                         DoMethod( cd->sound, DTM_TRIGGER, NULL, STM_PLAY, TAG_DONE );
  1028.                         cd->flags |= WRING_DONE;
  1029.                      }
  1030.                    break;
  1031.           
  1032.           case 16:
  1033.           case 31:
  1034.           case 46: if( cd->flags & WRING_DONE )
  1035.                      {
  1036.                         DisposeDTObject( cd->sound );
  1037.                         cd->flags ^= WRING_DONE;
  1038.                         cd->sound = NULL;                  
  1039.                      }         
  1040.                    break;
  1041.        }
  1042.      
  1043.      if( cd->flags & ALARM )
  1044.        {
  1045.           cd->woday[2] = cd->itext[2].IText[2];
  1046.                    
  1047.           if( !Strnicmp( cd->itext[2].IText, cd->woday, 4) )
  1048.             {
  1049.                if( !(cd->flags & ALARM_DONE) &&
  1050.                      cd->itext[2].IText[4] == cd->woday[4] )
  1051.                  {
  1052.                     if( (cd->flags & SOUND) && 
  1053.                         (cd->alarm = NewDTObject("DOpus5:Sounds/Alarm.snd",
  1054.                                                  DTA_GroupID, GID_SOUND,
  1055.                                                  TAG_DONE)) )
  1056.                       {
  1057.                          SetAttrs( cd->alarm, SDTA_Cycles, 3, TAG_DONE );
  1058.                          DoMethod( cd->alarm, DTM_TRIGGER, NULL, STM_PLAY, TAG_DONE );
  1059.                       }
  1060.                     LaunchCLI( ALARM_SCRIPT, NULL, NULL, NULL, NULL, NULL, NULL );
  1061.                     cd->flags |= ALARM_DONE ;
  1062.                  }
  1063.                
  1064.                if( (cd->flags & ALARM_DONE) &&
  1065.                    cd->itext[2].IText[4] == cd->woday[4] + 1 )
  1066.                  {
  1067.                     DisposeDTObject( cd->alarm );
  1068.                     cd->flags ^= ALARM_DONE;
  1069.                     cd->alarm = NULL;
  1070.                  }
  1071.             }         
  1072.        } 
  1073. }
  1074.  
  1075.  
  1076. void GetAlarm( ClockData *cd )
  1077. {
  1078.    cd->ncfg.nw_Parent = cd->win;
  1079.    cd->ncfg.nw_Title  = VERSION_STRING;
  1080.    cd->ncfg.nw_Dims   = &cfgwin; 
  1081.    cd->ncfg.nw_Locale = locale;
  1082.    cd->ncfg.nw_Port   = NULL;
  1083.    cd->ncfg.nw_Flags  = WINDOW_REQ_FILL | WINDOW_AUTO_KEYS | WINDOW_NO_CLOSE;
  1084.    cd->ncfg.nw_Font   = cd->txtfont;
  1085.    
  1086.    cd->time_req = OpenConfigWindow( &cd->ncfg );      
  1087.    
  1088.    cd->olist = AddObjectList( cd->time_req, winobjects ); 
  1089.    
  1090.    strncpy( cd->buffer, cd->woday, 2 )[2] = NULL;
  1091.    StrToLong( cd->buffer, (LONG *)&cd->running );
  1092.    cd->h = (UBYTE) cd->running;
  1093.    SetGadgetValue( cd->olist, GADGET_ID_HOURS, cd->h*59/23 );
  1094.    
  1095.    StrToLong( &cd->woday[3], (LONG *)&cd->running );
  1096.    cd->min = (UBYTE) cd->running;
  1097.    SetGadgetValue( cd->olist, GADGET_ID_MINUTES, cd->min ); 
  1098.    
  1099.    sprintf( cd->buffer, "%02ld.%02ld", cd->h, cd->min ); 
  1100.    SetGadgetValue( cd->olist, GADGET_ID_STRING, (ULONG) cd->buffer );             
  1101.    
  1102. }
  1103.  
  1104. BOOL HandleOwnRequest( ClockData *cd )
  1105. {
  1106.    cd->running = FALSE;
  1107.    
  1108.    if( cd->time_req )
  1109.      {              
  1110.         while( (cd->inmsg = GetWindowMsg( cd->time_req->UserPort)) )
  1111.           {
  1112.              switch( cd->inmsg->Class )
  1113.                {
  1114.                   case IDCMP_MOUSEMOVE: //slider
  1115.                                         switch( GET_ID(cd->inmsg) )
  1116.                                           {
  1117.                                              case GADGET_ID_HOURS:
  1118.                                                                    cd->h = cd->inmsg->Code*23/59;
  1119.                                                                    break;
  1120.                                              case GADGET_ID_MINUTES:
  1121.                                                                    cd->min = cd->inmsg->Code;
  1122.                                                                    break;
  1123.                                           }
  1124.                                         
  1125.                                         sprintf( cd->buffer, "%02ld.%02ld",
  1126.                                                  cd->h,
  1127.                                                  cd->min );
  1128.                                         SetGadgetValue( cd->olist, GADGET_ID_STRING, (ULONG) cd->buffer );
  1129.                                         break;
  1130.                   
  1131.                   case IDCMP_GADGETUP:
  1132.                                         switch( GET_ID(cd->inmsg) )
  1133.                                           {
  1134.                                              case GADGET_ID_OK:
  1135.                                                                     sprintf( cd->woday, "%02ld.%02ld",
  1136.                                                                              cd->h,
  1137.                                                                              cd->min );
  1138.                                                                     cd->flags |= ALARM;
  1139.                                                                     GetPopUpItem( &cd->popmenu, POPID_ALARMONOFF )->flags |= POPUPF_CHECKED;
  1140.                                                                     
  1141.                                                                     if( (cd->flags & ALARM_DONE) )
  1142.                                                                       {
  1143.                                                                          DisposeDTObject( cd->alarm );
  1144.                                                                          cd->flags ^= ALARM_DONE;
  1145.                                                                          cd->alarm = NULL;
  1146.                                                                       }
  1147.                                                                       
  1148.                                              case GADGET_ID_CANCEL:
  1149.                                                                     cd->running = TRUE;
  1150.                                                                     break;
  1151.                                           }
  1152.                                         break;
  1153.                }
  1154.              ReplyWindowMsg( cd->inmsg); 
  1155.           }   
  1156.      }
  1157.    return (BOOL) cd->running;
  1158. }
  1159.  
  1160. BOOL HandleIPC( ClockData *cd )
  1161. {
  1162.      cd->running = FALSE;
  1163.      
  1164.      while( (cd->ipcmsg = (APTR) GetMsg(cd->ipc->command_port)) )
  1165.        {
  1166.           if( cd->ipcmsg->command & CLOCK_QUIT )
  1167.             {
  1168.                cd->running = TRUE;
  1169.                IPC_Reply( cd->ipcmsg );
  1170.                break;
  1171.             }
  1172.             
  1173.           cd->day = 1;
  1174.                            
  1175.           if( cd->ipcmsg->command & BORDER )
  1176.             {
  1177.                cd->popitem = GetPopUpItem( &cd->popmenu, POPID_BORDER );
  1178.                               
  1179.                if( cd->ipcmsg->command & BORDER_ON )
  1180.                  {
  1181.                     cd->flags |= BORDER;
  1182.                     cd->popitem->flags |= POPUPF_CHECKED;
  1183.                  }
  1184.                else   
  1185.                  {
  1186.                     if( cd->flags & BORDER )
  1187.                       {
  1188.                          cd->flags ^= BORDER;
  1189.                          cd->popitem->flags ^= POPUPF_CHECKED;
  1190.                       }
  1191.                  }
  1192.                  
  1193.                if( cd->win )     
  1194.                     BorderDraw( cd );
  1195.             }
  1196.                            
  1197.           if( cd->ipcmsg->command & MODE_PASSED )
  1198.             {
  1199.                cd->itext[2].DrawMode = cd->itext[1].DrawMode = 
  1200.                cd->itext[0].DrawMode = ((CPrefsData *) cd->ipcmsg->data_free)->txtattr.ta_Flags;
  1201.             }
  1202.                            
  1203.           if( cd->ipcmsg->command & STYLE_PASSED )
  1204.             {
  1205.                cd->itext[2].ITextFont->ta_Style = cd->itext[1].ITextFont->ta_Style = 
  1206.                cd->itext[0].ITextFont->ta_Style = ((CPrefsData *) cd->ipcmsg->data_free)->txtattr.ta_Style;
  1207.                               
  1208.                if( cd->win )
  1209.                     SetSoftStyle( cd->win->RPort, cd->itext[2].ITextFont->ta_Style, AskSoftStyle( cd->win->RPort));                       
  1210.             }
  1211.                          
  1212.           if( cd->ipcmsg->command & APEN_PASSED )
  1213.             {
  1214.                cd->itext[2].FrontPen = cd->itext[1].FrontPen = 
  1215.                cd->itext[0].FrontPen = ((CPrefsData *) cd->ipcmsg->data_free)->ibox.Width;
  1216.             }
  1217.                          
  1218.           if( cd->ipcmsg->command & BPEN_PASSED )
  1219.             {
  1220.                cd->itext[2].BackPen = cd->itext[1].BackPen = 
  1221.                cd->itext[0].BackPen = ((CPrefsData *) cd->ipcmsg->data_free)->ibox.Height;
  1222.             }
  1223.                            
  1224.           if( cd->ipcmsg->command & BG_PIC )
  1225.             {
  1226.                if( cd->win )
  1227.                  {
  1228.                     cd->oldbm = cd->bm;
  1229.                     
  1230.                     if( (cd->bm = AllocBitMap(cd->ibox.Width, cd->ibox.Height,
  1231.                                               cd->screen->RastPort.BitMap->Depth,
  1232.                                               BMF_MINPLANES, cd->screen->RastPort.BitMap)) )
  1233.                       {
  1234.                          if( GetBitMap(cd, ((CPrefsData *) cd->ipcmsg->data_free)->picture) )
  1235.                            {
  1236.                               FreeBitMap( cd->oldbm );                         
  1237.                               strcpy( cd->picture, ((CPrefsData *) cd->ipcmsg->data_free)->picture );
  1238.                                    
  1239.                               if( cd->flags & BG_PLAIN )
  1240.                                    cd->flags ^= BG_PLAIN;
  1241.                               
  1242.                               if( cd->flags & BG_TRANS )
  1243.                                    cd->flags ^= BG_TRANS;
  1244.                               
  1245.                               cd->flags |= BG_PIC;
  1246.                               DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, POPID_PICTURE ); 
  1247.                            }
  1248.                          else
  1249.                            {
  1250.                               FreeBitMap( cd->bm );
  1251.                               cd->bm = cd->oldbm;
  1252.                            }   
  1253.                     
  1254.                          BorderDraw( cd );
  1255.                       }
  1256.                  }
  1257.                else
  1258.                  {
  1259.                     if( strlen(((CPrefsData *) cd->ipcmsg->data_free)->picture) )
  1260.                       {
  1261.                          strcpy( cd->picture, ((CPrefsData *) cd->ipcmsg->data_free)->picture );
  1262.                                    
  1263.                               if( cd->flags & BG_PLAIN )
  1264.                                    cd->flags ^= BG_PLAIN;
  1265.                               
  1266.                               if( cd->flags & BG_TRANS )
  1267.                                    cd->flags ^= BG_TRANS;
  1268.                               
  1269.                               cd->flags |= BG_PIC;
  1270.                               DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, POPID_PICTURE );
  1271.                       }
  1272.                     
  1273.                  }
  1274.             }
  1275.             
  1276.           if( cd->ipcmsg->command & BG_PLAIN )
  1277.             {
  1278.                cd->flags |= BG_PLAIN;
  1279.                
  1280.                if( cd->flags & BG_PIC )
  1281.                     cd->flags ^= BG_PIC;
  1282.                     
  1283.                if( cd->flags & BG_TRANS )
  1284.                     cd->flags ^= BG_TRANS;
  1285.                          
  1286.                DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, POPID_PLAIN );
  1287.                
  1288.                if( cd->win )
  1289.                  {
  1290.                     if( cd->bm )
  1291.                       {
  1292.                          FreeBitMap( cd->bm );
  1293.                          cd->bm = NULL;
  1294.                       }                                                      
  1295.                     BorderDraw( cd );   
  1296.                  }            
  1297.             }
  1298.                            
  1299.           if( cd->ipcmsg->command & BG_TRANS )
  1300.             {
  1301.                cd->flags |= BG_TRANS;
  1302.                
  1303.                if( cd->flags & BG_PLAIN )
  1304.                  {
  1305.                     if( !cd->bm )
  1306.                       {
  1307.                          cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
  1308.                                                cd->screen->RastPort.BitMap->Depth,
  1309.                                                BMF_MINPLANES, cd->screen->RastPort.BitMap );
  1310.                       }
  1311.                     cd->flags ^= BG_PLAIN;
  1312.                  }
  1313.                  
  1314.                if( cd->flags & BG_PIC )
  1315.                     cd->flags ^= BG_PIC;
  1316.                     
  1317.                if( cd->win )
  1318.                  {                   
  1319.                     CloseWin( cd );
  1320.                     OpenWin( cd );
  1321.                  }
  1322.                               
  1323.                DisableOther( &cd->popmenu, POPID_PLAIN, POPID_PICTURE, POPID_TRANSPARENT );
  1324.             }
  1325.                            
  1326.           if( cd->ipcmsg->command & ALARM )
  1327.             {
  1328.                if( strlen(((CPrefsData *) cd->ipcmsg->data_free)->alarm) )
  1329.                  {
  1330.                     strcpy(cd->woday, ((CPrefsData *) cd->ipcmsg->data_free)->alarm );
  1331.                                    
  1332.                     if( !(cd->flags & ALARM) )
  1333.                       {
  1334.                          cd->flags |= ALARM;
  1335.                          GetPopUpItem( &cd->popmenu, POPID_ALARM )->flags |= POPUPF_CHECKED;
  1336.                       }
  1337.                  }
  1338.                else
  1339.                  {
  1340.                     if( cd->ipcmsg->command & ALARM_OFF )
  1341.                       {
  1342.                          if( (cd->flags & ALARM) )
  1343.                            {
  1344.                               cd->flags ^= ALARM;
  1345.                               GetPopUpItem( &cd->popmenu, POPID_ALARM )->flags ^= POPUPF_CHECKED;
  1346.                            }
  1347.                       }
  1348.                     else
  1349.                       {
  1350.                          cd->flags |= ALARM;
  1351.                          GetPopUpItem( &cd->popmenu, POPID_ALARM )->flags |= POPUPF_CHECKED;
  1352.                       }                       
  1353.                  }
  1354.             }
  1355.                            
  1356.           if( cd->ipcmsg->command & SOUND )
  1357.             {
  1358.                if( cd->ipcmsg->command & SOUND_OFF )
  1359.                  {
  1360.                     if( cd->flags & SOUND )
  1361.                       {
  1362.                          cd->flags ^= SOUND;
  1363.                          GetPopUpItem( &cd->popmenu, POPID_SOUND )->flags ^= POPUPF_CHECKED;
  1364.                       }
  1365.                  }
  1366.                else
  1367.                  {
  1368.                     cd->flags |= SOUND;
  1369.                     GetPopUpItem( &cd->popmenu, POPID_SOUND )->flags |= POPUPF_CHECKED;
  1370.                  }                           
  1371.             }                            
  1372.                          
  1373.           if( cd->ipcmsg->command & NEW_FONT || cd->ipcmsg->command & NEW_SIZE )
  1374.             {
  1375.                if( cd->ipcmsg->command & NEW_FONT &&
  1376.                    Strnicmp(&((CPrefsData *) cd->ipcmsg->data_free)->fontname[cd->running=strlen(((CPrefsData *) cd->ipcmsg->data_free)->fontname)-5], ".font", 5) )
  1377.                     strcat( ((CPrefsData *) cd->ipcmsg->data_free)->fontname, ".font" );
  1378.                
  1379.                if( cd->ipcmsg->command & NEW_FONT )
  1380.                  {
  1381.                     strcpy( cd->fontname, ((CPrefsData *) cd->ipcmsg->data_free)->fontname );
  1382.                     cd->txtattr.ta_Name = cd->fontname;
  1383.                  }
  1384.                            
  1385.                if( cd->ipcmsg->command & NEW_SIZE )
  1386.                     cd->txtattr.ta_YSize = ((CPrefsData *) cd->ipcmsg->data_free)->txtattr.ta_YSize;
  1387.                
  1388.                if( cd->txtfont )
  1389.                     CloseFont( cd->txtfont );
  1390.                          
  1391.                cd->txtfont = OpenDiskFont( &cd->txtattr );
  1392.                                               
  1393.                GetSizes( cd );
  1394.                
  1395.                if( cd->bm )
  1396.                  {
  1397.                     FreeBitMap( cd->bm );
  1398.                     cd->bm = NULL;
  1399.                  } 
  1400.                  
  1401.                if( cd->flags & BG_PIC || cd->flags & BG_TRANS )
  1402.                  {
  1403.                     cd->bm = AllocBitMap( cd->ibox.Width, cd->ibox.Height,
  1404.                                           cd->screen->RastPort.BitMap->Depth,
  1405.                                           BMF_MINPLANES, cd->screen->RastPort.BitMap );
  1406.                          
  1407.                     if( cd->flags & BG_PIC )
  1408.                          GetBitMap( cd, cd->picture );
  1409.                  }
  1410.                     
  1411.                if( cd->win )
  1412.                  {
  1413.                     cd->ibox.Left = cd->win->LeftEdge;
  1414.                     cd->ibox.Top = cd->win->TopEdge;
  1415.                
  1416.                     CloseWin( cd );
  1417.                                  
  1418.                     OpenWin( cd );
  1419.                  }
  1420.             }
  1421.          
  1422.           if( cd->win )             
  1423.                PrintTime( cd );
  1424.                
  1425.           cd->running = FALSE;            
  1426.           IPC_Reply( cd->ipcmsg );         
  1427.        } 
  1428.        
  1429.      return (BOOL) cd->running;
  1430. }
  1431.  
  1432. void InitPopMenu( ClockData *cd )
  1433. {
  1434.      GetVar( CLOCKSTARTVAR, cd->buffer, 4, LV_VAR|GVF_GLOBAL_ONLY );
  1435.                     
  1436.         NewList( (struct List *) &cd->popmenu.item_list );
  1437.         NewList( (struct List *) &cd->submenu );
  1438.         NewList( (struct List *) &cd->subtime );
  1439.         
  1440.         cd->popmenu.flags = POPUPMF_REFRESH;
  1441.         cd->popmenu.callback = &refresh_callback;
  1442.         
  1443.         cd->popmenu.locale = locale;
  1444.         
  1445.         for( cd->running = MSG_POPSUB_ALARMSET; cd->running <= MSG_POPSUB_ALARMONOFF; cd->running++ )
  1446.            {
  1447.               if( (cd->popitem = AllocMemH(mempool, sizeof(PopUpItem))) )
  1448.                 {
  1449.                    cd->popitem->item_name = (char *) cd->running;
  1450.                    cd->popitem->flags = POPUPF_LOCALE;
  1451.                               
  1452.                    if( cd->running == MSG_POPSUB_ALARMONOFF )
  1453.                         cd->popitem->flags |= POPUPF_CHECKIT | (cd->flags & ALARM ? POPUPF_CHECKED : NULL);
  1454.                    
  1455.                    cd->popitem->id = cd->running;
  1456.                    
  1457.                    AddTail( (struct List *) &cd->subtime,
  1458.                             (struct Node *) &cd->popitem->node );
  1459.                 }
  1460.            }
  1461.         
  1462.         for( cd->running = MSG_POPSUB_PLAIN; cd->running <= MSG_POPSUB_PICTURE; cd->running++ )
  1463.            {
  1464.               if( (cd->popitem = AllocMemH(mempool, sizeof(PopUpItem))) )
  1465.                 {
  1466.                    cd->popitem->item_name = (char *) cd->running;
  1467.                    cd->popitem->flags = POPUPF_LOCALE|POPUPF_CHECKIT;
  1468.                    
  1469.                    if( cd->flags & (1 << (cd->running-MSG_POPSUB_PLAIN+9)) ) 
  1470.                         cd->popitem->flags |= POPUPF_CHECKED;
  1471.                    
  1472.                    cd->popitem->id = cd->running;
  1473.                    
  1474.                    AddTail( (struct List *) &cd->submenu,
  1475.                             (struct Node *) &cd->popitem->node );
  1476.                 }
  1477.            }
  1478.                 
  1479.         for( cd->running = MSG_POP_CHANGEBACK; cd->running <= MSG_POP_ABOUT; cd->running++ )
  1480.            {
  1481.               if( (cd->popitem = AllocMemH(mempool, sizeof(PopUpItem))) )
  1482.                 {
  1483.                    cd->popitem->item_name = (char *) cd->running;
  1484.                    cd->popitem->flags = POPUPF_LOCALE;
  1485.                    
  1486.                    switch( cd->running )
  1487.                      {
  1488.                         case MSG_POP_CHANGEBACK:
  1489.                                                  cd->popitem->flags |= POPUPF_SUB;
  1490.                                                  cd->popitem->data = &cd->submenu;
  1491.                                                  break;
  1492.                         
  1493.                         case MSG_POP_AUTOSTART :
  1494.                                                  cd->popitem->flags |= POPUPF_CHECKIT | (cd->buffer[0] == '1' ? POPUPF_CHECKED : NULL);
  1495.                                                  break;
  1496.                         
  1497.                         case MSG_POP_BORDER    :
  1498.                                                  cd->popitem->flags |= POPUPF_CHECKIT | (cd->flags & BORDER ? POPUPF_CHECKED : NULL);
  1499.                                                  break;
  1500.                                                  
  1501.                         case MSG_POP_SOUND     :
  1502.                                                  cd->popitem->flags |= POPUPF_CHECKIT | (cd->flags & SOUND ? POPUPF_CHECKED : NULL);
  1503.                                                  break;
  1504.                                                 
  1505.                         case MSG_POP_ALARM     :
  1506.                                                  cd->popitem->flags |= POPUPF_SUB;
  1507.                                                  cd->popitem->data = &cd->subtime;
  1508.                                                  break;
  1509.                      }
  1510.                   
  1511.                    cd->popitem->id = cd->running - MSG_POP_CHANGEBACK;
  1512.                    
  1513.                    AddTail( (struct List *) &cd->popmenu.item_list,
  1514.                             (struct Node *) &cd->popitem->node );
  1515.                 }
  1516.               
  1517.               if( cd->running == MSG_POP_CHANGEFONT ||
  1518.                   cd->running == MSG_POP_ALARM ||
  1519.                   cd->running == MSG_POP_QUIT  )
  1520.                 {
  1521.                    if( (cd->popitem = AllocMemH(mempool, sizeof(PopUpItem))) )
  1522.                      {
  1523.                         cd->popitem->item_name = POPUP_BARLABEL;
  1524.                         cd->popitem->id = cd->running;
  1525.                    
  1526.                         AddTail( (struct List *) &cd->popmenu.item_list,
  1527.                                  (struct Node *) &cd->popitem->node );
  1528.                      }
  1529.                 }
  1530.            }   
  1531. }
  1532.  
  1533.